<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="../js/vue.js"></script>
    <style>
        * {
            padding: 0;
            margin: 0;
        }

        li {
            list-style: none;
            line-height: 40px;
            border: 1px dashed #333;
        }

        .wrap {
            margin-bottom: 40px;
        }
    </style>
</head>

<body>
    <div id="app">
        <p>
            count: {{count}}
        </p>
        <p>
            <button @click="count++">count++</button>
        </p>
        <hr>
        <p>
            搜索:<input type="text" v-model="search" @focus="focusHandler" @blur="blurHandler">
        </p>
        <ul v-if="searchList&&isShow">
            <li v-for="item,index in searchList" :key="index">{{item}}</li>
        </ul>
    </div>
</body>
<script>
    /* 
        watch 侦听器, 监听data/computed上的数据改变,并执行一系列副作用操作!! (当前数据改变后可能造成的影响)
            作用:
            1. 可以检测数据改变
            2. 数据改变后可以做一些其他处理

        如何使用watch:
            在new Vue(option)的配置对象中新增watch属性,属性值也是一个对象
            1. 对象的键名: 就是要监听的属性名 (data/computed)
            2. 对象的键值: 数据改变后要执行的回调函数,回调函数有两个参数(newVal,oldVal),分别表示新值和旧值  


        watch小结:
            1. watch更注重自身改变,对其他数据造成的影响(可以执行一系列副作用操作)
            2. watch可以支持异步操作
            3. watch监听数据时是惰性的, watch在初始化渲染结果并不会立即执行, 而是等数据改变之后才会执行


    */
    var vm = new Vue({
        el: "#app",
        data: {
            count: 100,
            search: "",  // 搜索关键词
            searchList: null, // 搜索结果
            isShow:false,
        },
        methods: {
            focusHandler(){
                this.isShow = true;
            },  
            blurHandler(){
                this.isShow = false;
            }  
        },
        watch: { // 配置侦听器(对象)
            // 对象的键名: 就是要监听的属性名 (data/computed)
            // 对象的键值: 数据改变后要执行的回调函数,回调函数有两个参数(newVal,oldVal),分别表示新值和旧值   

            // watch 监听数据改变, 做一个展示(方便调试)
            count: function (newVal, oldVal) {
                console.log("数据改变了count:", newVal, oldVal);
            },

            // watch 监听数据,执行一系列副作用操作   (搜索关键词改变 => 发送ajax请求 => 获取请求结果 => 结果渲染)
            search: function (newVal) {
                console.log("数据改变了search:", newVal);

                if (newVal) {
                    // 模拟ajax请求
                    setTimeout(() => {
                        // 模拟数据
                        let list = new Array(10).fill(newVal).map((v, i) => v + (i + 1));
                        this.searchList = list;
                    }, 150)
                }
            }

        }

    })



</script>

</html>